home *** CD-ROM | disk | FTP | other *** search
- -------------------------------------------------------------------------------
-
-
- /¯¯¯¯¯) /¯) /¯¯¯¯¯) /¯¯¯¯¯)
- / /¯) / / / / ____/ / /¯) /
- / (_/ / / / / / / (_/ /
- / ____/ /¯¯¯¯) /¯¯¯¯¯) / / /¯¯¯¯¯) /¯¯¯¯¯) /¯¯¯) / ¯¯¯) / /
- / / / /¯¯¯ / /¯) / / / / /¯) / / /¯) / (___/ / /¯) / / /¯) /
- / / / / / (_/ / / / / (_/ / / (_/ / / (_/ / / (_/ /
- (_/ (_/ (_____/ (_/ (_____/ (___ / (_____/ (_____/
- / /
- /¯¯¯¯ /
- (_____/
-
- (Vorab-Version)
-
-
-
- © Copyright 1989-1994 Jens Kilian
- Alle Rechte vorbehalten
-
-
- ------- Inhaltsverzeichnis ----------------------------------------------------
-
- CODES Vorübersetzte Versionen von Compiler und
- BUILTINS.WAM Laufzeitsystem
- DEBUGGER.WAM
- DRIVER.WAM
- DSTRUCT.WAM
- ENCODER.WAM
- INDEXER.WAM
- LIBRARY.WAM
- SHELL.WAM
- TMPALLOC.WAM
- XLATOR.WAM
-
- DOC
- LIESMICH Dieses Dokument (deutsche Version)
- README Dieses Dokument (englische Version)
-
- INIT.WAM Initialisierungsdateien
- PROLOG.LST
-
- WAM.TOS Hauptprogramm (Emulator, Systemfunktionen)
- MWAM.TOS Hauptprogramm, MiNT Library (ungetestet!)
-
- ------- Kurzbeschreibung ------------------------------------------------------
-
- Dieses Paket enthält die Vorabversion 0.94.17 von Prolog-68, einem nicht mehr
- ganz neuen :-) Prolog-System für den ATARI ST. Wenn das Programm fertig-
- gestellt ist, wird es als freie Software (NICHT als Public-Domain-Software!)
- zusammen mit dem Quellcode öffentlich zugänglich sein. Das wird noch etwas
- dauern.
-
- Die vorliegende Version darf frei verbreitet, aber NICHT verändert oder
- kommerziell genutzt werden. Als kommerzielle Nutzung gilt auch der Vertrieb
- über einen Public-Domain-Versand, sofern die erhobene Gebühr für den Versand
- einer Einzeldiskette die Summe aus Diskettenpreis und Versandkosten um mehr
- als DM 2,- übersteigt.
-
- Noch einmal: Dies ist eine Vorabversion, d.h. daß ich noch nicht einmal
- dafür garantiere, daß die hier gemachten Aussagen zutreffen!
-
- Prolog-68 basiert auf der `Warren Abstract Machine'; es enthält einen (in
- Prolog geschriebenen) Compiler, der die Programmklauseln in einen Zwischencode
- übersetzt. Der Zwischencode wird als `direct threaded code' gespeichert und von
- einem Simulator abgearbeitet. Das Systemm erreicht so eine Geschwindigkeit
- von 12 kLIPS unter dem 'nrev'-Benchmark, was für Prolog auf dem Atari ST einen
- durchaus annehmbaren Wert darstellt. Das Programm wurde auf einem ST mit 4MB
- Hauptspeicher getestet, sollte aber in der vorliegenden Version auf allen
- Atari-Rechnern mit 680x0-Prozessor lauffähig sein. Bei Schwierigkeiten mit TTs,
- Falcons oder STs mit Beschleunigerkarten wird um genaue Fehlerbeschreibungen
- gebeten, weil ich mangels entsprechender Hardware keine eigenen Tests durch-
- führen kann. Wie üblich gilt für den verfügbaren Speicher `mehr ist besser';
- benötigt werden mindestens 250 KByte, um das Programm überhaupt laden zu
- können. Die Dateien im Ordner 'CODES' enthalten eine bereits übersetzte Version
- des Compilers und der Benutzerschnittstelle. DIESE DATEIEN DÜRFEN AUF KEINEN
- FALL VERÄNDERT WERDEN, WEIL PROLOG-68 SONST NICHT MEHR GESTARTET WERDEN KANN!
-
- ------- Inkompatibilitäten zu früheren Versionen ------------------------------
-
- Von Version 0.9 nach Version 0.91:
-
- - Auf Prolog-Ebene werden alle Zeichen nach dem Unicode-Standard dargestellt
- (ISO DIS 10646-1.2 Basic Multilingual Plane). Frühere Versionen verwendeten
- stattdessen erweitertes ASCII nach ISO 8859-1 bzw. (noch früher) den Atari-
- -Zeichensatz.
- Der herausragende Unterschied ist die Darstellung von Zeilenenden in Text-
- dateien. Alle eingelesenen Zeilenenden entsprechen in Prolog dem Zeichencode
- 16'2028 (ASCII NL = 16'0a wird bei der Ausgabe als gleichwertig betrachtet).
- Programme, die is_endline/1 oder is_newline/1 zur Abfrage von Zeilenenden
- benutzen, sollten keine Schwierigkeiten haben; das gilt auch für die
- Verwendung der Escape-Sequenz "\n".
-
- (Da ich inzwischen feststellen mußte, daß dieses 'Feature' mehr Ärger als
- Nutzen verursacht, werde ich es in der nächsten Version wieder rauswerfen.
- Sorry.)
-
- - Nach dem zukünftigen ISO-Standard hat ein 'cut' in der Vorbedingung eines
- Aufrufs von '->'/2 keine Auswirkungen auf den Rest der Klausel.
-
- - Die Prädikate constant/1 und nonconstant/1 sind verschwunden (durch atomic/1
- bzw. nonatomic/1 ersetzen). Darüber wollen Sie nichts wissen.
-
- Von Version 0.91 nach Version 0.93:
-
- - Zeilenenden werden aus den erwähnten Gründen wieder als ASCII-Newlines
- dargestellt.
-
- - Die Dateiöffnungsmodi 'read_binary', 'write_binary' und 'append_binary'
- sind nicht mehr erlaubt, weil sie durch das Konzept der 'Stream-Optionen'
- aus dem ISO-Standard abgedeckt werden.
-
- - Es ist nicht mehr möglich, compilierte Prädikate aufzulisten oder per
- Einzelschritt abzuarbeiten. Zugriff auf einzelne Klauseln ist nur für
- interpretierte (dynamische) Prädikate möglich. Es ist allerdings immer
- noch möglich, im Debugger 'spy points' auf compilierte Prädikate zu setzen.
-
- - Der Debugger kann jetzt explizit ein- und ausgeschaltet werden. Es ist nicht
- mehr nötig, das zu untersuchende Prädikat mit anzugeben. Die Prädikate
- debug/1 und trace/1 existieren nicht mehr.
-
- Von Version 0.93 nach Version 0.94:
-
- - absolute_file_name/2 kann unterschiedliche Ergebnisse liefern, weil es jetzt
- auch '/' als Trennzeichen akzeptiert (z.B. unter MiNT).
-
- ------- Bekannte Fehler -------------------------------------------------------
-
- Die vorliegende Version 0.94.17 hat folgende Fehler, die in zukünftigen
- Versionen behoben sein werden:
-
- * NUL-Zeichen (ASCII 0) sind in Namen von Atomen nicht erlaubt.
-
- * Einige Datenbankoperationen können ein fehlerhaftes Update-Verhalten
- aufweisen. (D.h. daß eine Veränderung auch für Aufrufe sichtbar sein
- kann, die vor dieser Veränderung begannen.)
-
- ------- Programmaufruf --------------------------------------------------------
-
- Zulässig sind die folgenden Kommandozeilen-Optionen:
-
- -help Gibt eine Kurzbeschreibung der zulässigen Optionen aus.
-
- -debug Schaltet einen internen Testmodus ein. In der jetzigen
- Form dürfte der Autor der einzige sein, der mit dieser
- Option etwas anfangen kann.
-
- -dribble <File> Öffnet eine Datei, in der alle von der Tastatur ein-
- gegebenen Zeichen mitprotokolliert werden (nützlich zum
- Beschreiben von Fehlern).
-
- -code <Größe> Vergibt Speicher für den Codebereich; dort werden alle
- langlebigen Datenstrukturen (z.B. Atome, Funktoren und
- Klauseln) gespeichert.
-
- -global <Größe> Vergibt Speicher für den globalen Bereich, in dem alle
- während des Programmablaufs entstehenden Terme abgelegt
- werden.
-
- -local <Größe> Vergibt Speicher für den lokalen Bereich, der zur
- Kontrolle des Programmablaufs und zum Speichern von
- lokalen Variablen benutzt wird.
-
- -reserve<Größe> Gibt Speicher ans Betriebssystem zurück.
-
- Prolog-68 speichert alle Informationen in drei großen Speicherbereichen.
- Die Größe dieser Bereiche wird beim Programmstart festgelegt und zur
- Laufzeit nicht mehr verändert. Diese Einschränkung kann dazu führen, daß
- ein Prolog-Programm wegen Speichermangel abgebrochen wird, obwohl genug
- freier Speicher vorhanden ist (zukünftige Versionen werden einen
- Mechanismus enthalten, mit dem der freie Speicher zur Laufzeit neu verteilt
- werden kann). Auf Rechnern mit kleinem Hauptspeicher ist es daher wichtig,
- beim Start des Programms die Größen der Speicherbereiche richtig zu setzen.
- Prolog-68 benutzt ohne zusätzliche Angaben eine sehr grobe Aufteilung, die
- nur bei reichlich freiem Speicher zuverlässig funktioniert. Auf STs mit
- nur 1MB RAM sollte zumindest der Codebereich auf ca. 250-300 KB gesetzt
- werden; bei noch weniger Speicher stellen 150 KB das absolut nötige
- Minimum dar.
-
- Der verfügbare Speicher kann über die Optionen '-code', '-global', '-local'
- und '-reserve' auf die verschiedenen Bereiche verteilt werden. Diese Optionen
- dürfen in beliebiger Reihenfolge angegeben werden und auch mehrfach vorkommen
- (wobei dann die einzelnen Werte summiert werden).
-
- Alle vier Optionen müssen von einem zusätzlichen Parameter gefolgt werden,
- der die Größe des zu vergebenden Speicherbereichs angibt. Er besteht aus
- einer Dezimalzahl, die von einem der Zeichen 'k', 'K', 'm', 'M' oder '%'
- gefolgt werden kann. Bei Angabe eines der Buchstaben oder beim Fehlen des
- zusätzlichen Zeichens wird die entsprechende Anzahl Bytes (bzw. KBytes oder
- MBytes) reserviert; bei Angabe von '%' wird stattdessen der angegebene
- Prozentsatz des noch nicht vergebenen Speichers benutzt. Aufeinanderfolgende
- Prozentangaben beziehen sich auf denselben Gesamtwert.
-
- Fehlen in der Kommandozeile Angaben zu einem oder mehreren der drei Bereiche,
- so wird der gesamte nach Abarbeitung der Kommandozeile verbleibende Speicher
- auf die fehlenden Bereiche verteilt, und zwar im Verhältnis 1:2:4 für
- Codebereich, lokalen und globalen Bereich. Wie oben erwähnt, ist diese
- Aufteilung für Rechner mit wenig Speicher nicht sinnvoll -- dort muß
- zumindest der Codebereich vergrößert werden.
-
- Bleibt nach der Aufteilung Speicher übrig, so wird dieser an das
- Betriebssystem zurückgegeben. Das ist insbesondere dann wichtig, wenn (von
- Prolog aus oder in einem Multitasking-System wie MiNT) andere Programme
- aufgerufen werden sollen. Die Option '-reserve' tut im Prinzip dasselbe,
- erlaubt aber die explizite Angabe der Größe des zurückgegebenen
- Speicherbereichs im selben Format wie bei den anderen Optionen.
-
- Es folgen ein paar Beispiele, die die Flexibilität dieses Verfahrens
- verdeutlichen sollen. Angenommen sei, daß beim Programmstart genau 2 MByte
- an Hauptspeicher zur Verfügung stehen:
-
- -code 1M -global 50% -local 25%
- Der Codebereich erhält zunächst 1 MByte. Vom verbleibenden Speicher
- geht die Hälfte (512 KByte) an den globalen Bereich, ein Viertel
- (also 256 KByte) an den lokalen Bereich. Es verbleibt ein Rest
- von 256 KByte, der ans Betriebssystem zurückgeht.
-
- -code 25% -local 512K -code 25%
- Von den ursprünglichen 2 MByte wird zunächst ein Viertel für den
- Codebereich reserviert. Weitere 512 KByte gehen an den lokalen Bereich.
- Es verbleiben 1 MByte, von denen wiederum ein Viertel dem Codebereich
- zugeschlagen wird. Der restliche Speicher wird für den globalen Bereich
- verwendet, da für diesen keine Angabe gemacht wurde.
-
- Keine Angabe (Default)
- 1/7 des Speichers geht an den Codebereich, 2/7 an den lokalen Bereich.
- Die restlichen 4/7 werden für den globalen Bereich verwendet. Es wird
- kein Speicher ans Betriebssystem zurückgegeben.
-
- ------- Vordefinierte Prädikate -----------------------------------------------
-
- Ich bemühe mich, ein möglichst vollständiges Prolog zu erstellen, das zum
- zukünftigen ISO-Standard kompatibel ist. Die aktuelle Version wurde haupt-
- sächlich von Edinburgh-Prolog und den davon abgeleiteten Dialekten inspiriert;
- deshalb können sich viele Details noch ändern.
- Die meisten vordefinierten Prädikate sind bereits implementiert, können aber
- hier nur kurz beschrieben werden:
-
- - Steuerung:
-
- ','/2 (übliche Kontrollkonstrukte)
- ';'/2
- '!'/2
- '->'/2
- call/1
- '\+'/1 (nicht-Beweisbarkeit, keine echte Verneinung)
- once/1
- true/0
- otherwise/0 (= true/0)
- fail/0
- false/0 (= fail/0)
- repeat/0
- if_exception/3 (Fehlerbehandlung)
- signal_exception/1
- signal_error/3
- propagate_error/4
- trap/2
- set_error_handler/3
-
- Der 'cut' funktioniert auch innerhalb von Metacalls, er ist dort
- aber in seiner Reichweite beschränkt. Im Aufruf 'call(X)' wirkt ein
- in 'X' vorkommender 'cut' nur innerhalb der Klammern. Eine Faustregel:
- `Buchstaben blockieren den cut'.
-
- '->'/2 wirkt wie ein 'cut', der auf einen Teil einer Klausel beschränkt
- ist. Der Aufruf (P -> Q; R) wirkt wie ein IF/THEN/ELSE-Konstrukt:
- kann P erfüllt werden, dann wird Q aufgerufen, andernfalls R.
- (P -> Q) allein wirkt wie (P -> Q; fail).
- Der ISO-Standard verlangt, daß ein 'cut' innerhalb der Vorbedingung
- (P im Beispiel) keine Auswirkungen auf den Rest der Klausel hat. Die
- obige Faustregel gilt hier also NICHT!
-
- if_exception/3 und signal_exception/1 werden in einer der nächsten
- Versionen durch die ISO-Versionen (catch/3 und throw/1) ersetzt werden.
- Die Prädikate signal_error/3, propagate_error/4, trap/2 und
- set_error_handler/3 werden zugunsten einer ISO-kompatiblen Fehler-
- behandlung verschwinden.
-
- - Ein-/Ausgabe:
-
- read/1 (Ein-/Ausgabe von Termen)
- write/1
- writeq/1
- display/1 (Ausgabe immer nach 'user'!)
- write_canonical/1 (Ausgabe in Präfixform, heißt auch displayq/1)
- print/1 (Ausgabe über portray/1, falls vom Benutzer
- definiert)
- portray_clause/1 (Ausgabe von Klauseln in leicht lesbarer Form)
-
- get0/1 (Ein-/Ausgabe von Zeichen)
- get/1
- skip/1 (*)
- put/1 (*)
- nl/0
- tab/1 (* diese Prädikate können einen arithmetischen
- Ausdruck als Parameter erhalten)
-
- is_endfile/1 (Dateiendezeichen festlegen)
- is_newline/1 (Zeilenendezeichen festlegen)
- is_newpage/1 (Seitenendezeichen festlegen)
- is_endline/1 (Zeilenende erkennen - nur mit instantiiertem
- Argument aufrufen!)
-
- open/4 (Verwaltung von Datenströmen)
- open/3
- open_null_stream/1
- close/1
- current_stream/3
- stream_property/2
- nofileerrors/0
- fileerrors/0
- flush_output/1
- set_input/1
- set_output/1
- current_input/1
- current_output/1
- absolute_file_name/2
-
- read/2 (Ein-/Ausgabe von Termen auf beliebige Datenströme)
- write/2
- writeq/2
- display/2
- write_canonical/2 (heißt auch displayq/2)
- print/2
-
- get0/2 (Zeichen-Ein-/Ausgabe auf beliebige Datenströme)
- get/2
- skip/2 (*)
- put/2 (*)
- nl/1
- tab/2 (* siehe oben)
-
- character_count/2 (Abfrage von Datenströmen)
- line_count/2
- line_position/2
- stream_position/2
- set_stream_position/2
- stream_position/3
-
- see/1 (Prolog-10-kompatible Dateiverwaltung)
- seeing/1
- seen/0
- tell/1
- telling/1
- told/0
-
- ttyget0/1 (Prolog-10-kompatible Terminal-Ein-/Ausgabe)
- ttyget/1
- ttyskip/1
- ttyput/1
- ttynl/0
- ttytab/1
-
- op/3 (Operatoren definieren & löschen)
- current_op/3 (Operatoren abfragen)
-
- sread/2 (Term mit Symboltabelle lesen)
- sread/3 (dasselbe mit Angabe eines Datenstroms)
-
- Ein Datenstrom ist ein spezielles Objekt, das z.B. mit
-
- open(+Dateiname, +Modus, -Datenstrom)
- oder open(+Dateiname, +Modus, -Datenstrom, +Optionen)
-
- erzeugt werden kann. `Dateiname' ist der Name einer Datei, `Modus' muß
- eines der Atome 'read', 'write' oder 'append' sein. `Optionen', falls
- angegeben, muß eine Liste sein, die nur Elemente der folgenden Arten
- enthalten darf; anhand dieser Angabe wird die Art des geöffneten
- Datenstroms festgelegt:
-
- type(Type) Der Typ der Daten, die der Strom enthält.
- Erlaubt sind 'text' (Atari-Textformat), 'utf'
- (Text, der Zeichen aus anderen Zeichensätzen
- enthalten kann), oder 'binary' (rohe Bytes).
- alias(Alias) Ein Alias-Name für den Datenstrom (`Alias' muß
- ein Atom sein).
- eof_action(Action) Gibt an, wie der Versuch, über das Dateiende
- hinaus zu lesen, behandelt wird; entweder
- 'error' (Fehler wird ausgelöst), 'eof_code'
- (Dateiendezeichen wird zurückgegeben) oder
- 'reset' (Zurücksetzen).
- reposition Nur aus Kompatibilitätsgründen vorhanden - in
- Prolog-68 können alle Dateien, die vom Benutzer
- geöffnet werden, positioniert werden.
-
- Der erzeugte Datenstrom kann in Prädikaten wie z.B.
-
- write(+Datenstrom, ?Term)
-
- benutzt und mit
-
- close(+Datenstrom)
-
- wieder geschlossen werden.
-
- Neben diesen Datenströmen für Dateien gibt es noch vordefinierte
- Datenströme, die über folgende Namen angesprochen werden:
-
- user (zur Kompatibilität)
- user_input
- user_output
- user_error
-
- - Arithmetik:
-
- 'is'/2 (Auswertung von Ausdrücken)
-
- '=:='/2 (Vergleich von Ausdrücken)
- '=\='/2
- '<'/2
- '=<'/2
- '>'/2
- '>='/2
-
- - Termklassifizierung:
-
- var/1
- nonvar/1
- atom/1
- integer/1
- atomic/1
-
- nonatomic/1 (Verneinung von atomic/1)
- composite/1 (zusammengesetzter Term?)
- simple/1 (Verneinung von composite/1)
- callable/1 (aufrufbarer Term?)
-
- - Strukturzugriff:
-
- functor/3
- arg/3
- '=..'/2
-
- name/2 (Konvertierung zwischen Konstanten und Strings)
- atom_chars/2
- number_chars/2
-
- numbervars/3 (Variablen numerieren, z.B. für write/1)
-
- - Vergleiche von beliebigen Termen:
-
- '=='/2
- '\=='/2
- '@<'/2
- '@=<'/2
- '@>'/2
- '@>='/2
- compare/3
- sort/2
- msort/2
- keysort/2
-
- Beim Vergleichen von Termen mit '@<', ..., '@>=' wird folgende
- totale Ordnung über der Menge aller Terme benutzt:
-
- a) Variablen @< Zahlen @< Atome @< Zusammengesetzte Terme
-
- b) Variable1 @< Variable2 ist eindeutig definiert, hat aber
- keine Aussagekraft für den Benutzer
-
- c) Zahl1 @< Zahl2 wenn Zahl1 < Zahl2
-
- d) Atom1 @< Atom2 wenn der Name von Atom1 lexikographisch
- kleiner ist als der Name von Atom2
-
- e) Term1 @< Term2 wenn i) die Stelligkeit von Term1 kleiner als
- die Stelligkeit von Term2 ist
- ii) die Stelligkeiten gleich sind und
- Funktor(Term1) @< Funktor(Term2)
- iii) die Stelligkeiten und Funktoren gleich
- sind und es ein i gibt, so daß
-
- für alle j, 1 ≤ j < i:
- Argument(Term1, j) == Argument(Term2, j)
-
- und
- Argument(Term1, i) @< Argument(Term2, i)
-
- compare/3 verhält sich so, als ob es wie folgt definiert wäre:
-
- compare('<', X, Y) :- X @< Y.
- compare('=', X, Y) :- X == Y.
- compare('>', X, Y) :- X @> Y.
-
- sort/2, msort/2 und keysort/2 sortieren Listen gemäß der obigen
- Ordnungsrelation. sort/2 entfernt doppelt vorkommende Elemente,
- msort/2 tut dies nicht; keysort/2 erwartet eine Liste, deren Elemente
- die Form
-
- Key - Value
-
- besitzen. Dabei werden die 'Values' ignoriert, die 'Keys' dienen als
- Sortierschlüssel. keysort/2 behält doppelt auftretende Elemente bei;
- diese erscheinen im Ergebnis in derselben Reihenfolge wie im Original.
- Beispiel:
-
- | ?- keysort([4-a, 1-b, 5-c, 1-d, 4-e, 0-f], Sorted).
- Sorted = [0-f, 1-b, 1-d, 4-a, 4-e, 5-c]
-
- Diese drei Prädikate haben im besten Fall linearen Aufwand, im
- schlechtesten Fall sind sie O(NlogN) (woraus messerscharf geschlossen
- werden kann, daß es sich hierbei NICHT um 'Quicksort' handelt).
-
- - Programme laden:
-
- compile/1 (alle nicht als dynamisch deklarierten Prädikate
- werden compiliert)
- consult/1 (nur laden, nichts compilieren)
- reconsult/1 (identisch mit consult/1, nur aus Gründen der
- Kompatibilität vorhanden)
-
- Die folgenden Direktiven aus dem ISO-Standard werden erkannt
- (weitere werden in zukünftigen Versionen folgen):
-
- :-dynamic ... (Prädikat als dynamisch deklarieren)
- :-discontiguous ... (wird in Prolog-68 nicht benötigt)
- :-include ... (Datei einfügen)
-
- - Programmzustand:
-
- listing/0 (alle dynamischen Prädikate auflisten)
- listing/1 (einige dynamische Prädikate auflisten)
-
- current_atom/1 (Abfrage von momentan bekannten Atomen etc.)
- current_predicate/2
- predicate_property/2
-
- halt/0 (Programm anhalten)
- halt/1 (dito, mit Angabe des Exit-Codes)
- break (verschachtelte Instanz von Prolog aufrufen)
- abort (Programmabbruch und zurück zum ersten Prompt)
-
- - Debugger:
-
- trace/0 (Debugger im Kriechmodus aktivieren)
- debug/0 (Debugger im Sprungmodus aktivieren)
- nodebug/0 (Debugger deaktivieren)
-
- spy/1 (Haltepunkte setzen & löschen)
- nospy/1
- leash/1
- harness/1
- debugging/1
- unknown/2 (Überwachung undefinierter Prädikate)
-
- unknown(-OldAction, +NewAction) ist eine abgekürzte Version von
- prolog_flag(unknown, -OldAction, +NewAction) (siehe dort).
-
- Nähere Informationen kann ich hier nicht geben, sie sollten aber
- in jedem besseren Prolog-Lehrbuch zu finden sein.
-
- - Datenbank:
-
- abolish/1 (Prädikate ganz löschen)
- abolish/2
- asserta/1 (Klauseln zu einem dynamischen Prädikat hinzufügen)
- assertz/1
- assert/1 (= asserta/1)
- retract/1 (Klauseln eines dynamischen Prädikats löschen)
- retractall/1
- clause/2 (Klauseln eines dynamischen Prädikats abfragen)
-
- - Datenbankverweise:
-
- Datenbankverweise dienen zum schnelleren Zugriff auf gespeicherte
- Klauseln, Terme etc.
-
- asserta/2 (wie oben, mit Rückgabe eines Datenbankverweises)
- assertz/2
- assert/2
- clause/3
-
- instance/2 (Klausel oder Term zu gegebenem Verweis abfragen)
- erase/1 (Klausel oder Term zu gegebenem Verweis löschen)
-
- - Interne Datenbank:
-
- Die interne Datenbank gibt es nur aus Effizienzgründen. Mit den
- zugehörigen Prädikaten können nur Terme, keine Klauseln gespeichert
- werden.
-
- recorda/3
- recordz/3
- recorded/3
- current_key/2
-
- Mit recorda(+Schlüssel, +Term, -Verweis)
- bzw. recordz(+Schlüssel, +Term, -Verweis)
- kann der `Term' unter dem `Schlüssel' in der internen Datenbank
- gespeichert werden. Als Ergebnis erhält man einen Verweis auf
- den gespeicherten Term, der zum Löschen über erase/1 verwendet
- werden kann. Mit recorded(+S, ?T, ?V) kann man den gespeicherten
- Term wieder zurückholen. current_key(?KeyName, ?KeyTerm) ermöglicht
- die Abfrage aller vorhandenen Schlüssel.
-
- - Mengenoperationen:
-
- setof/3 und bagof/3 sind noch nicht implementiert.
-
- findall/3 (alle Lösungen eines Aufrufs finden)
-
- Der Unterschied zwischen findall/3 und bagof/3 liegt in der
- Behandlung freier Variablen in dem Aufruf, der als zweiter Parameter
- übergeben wird. bagof/3 sammelt alle Lösungen, für die sich für diese
- Variablen der gleiche Wert ergibt, während findall/3 freie Variablen
- als existenzquantifiziert ansieht.
-
- - Grammatikregeln:
-
- expand_term/2 (Wird aufgerufen, bevor eine eingelesene Klausel
- compiliert wird; erledigt die Umsetzung von
- Grammatikregeln. Der Benutzer kann das Prädikat
- term_expansion/2 definieren, um zusätzliche
- Umsetzungen vorzunehmen.)
-
- phrase/3 (Aufruf einer Grammatikregel)
- phrase/2
-
- Bei phrase/[2,3] darf eine komplette Phrase (rechte Seite einer
- Grammatikregel) angegeben werden. phrase/2 ist folgendermaßen
- definiert:
-
- phrase(Phrase, Liste) :- phrase(Phrase, Liste, []).
-
- - Sonstiges:
-
- '='/2 (Unifikation)
-
- length/2 (Listenoperationen)
- member/2
- memberchk/2
- append/3
-
- prolog_flag/3 (globale Flags abfragen/verändern)
- prolog_flag/2
- prompt/2 (Eingabeprompt abfragen/verändern)
- statistics/0 (Statistiken ausgeben)
- statistics/2 (Statistiken abfragen)
-
- garbage_collect/0 (Speicherbereinigung)
- system/1 (Übergabe eines Atoms an eine Shell, z.B. Guläm)
-
- prolog_flag/2 und prolog_flag/3 verwalten globale Flags, die
- bestimmte interne Abläufe steuern. Der Wert eines Flags ist - im
- Gegensatz zu anderen Prolog-Systemen - immer eine Integerzahl (aber
- das kann sich in zukünftigen Versionen noch ändern). Im Moment gibt es
- folgende Flags:
-
- Name Werte (Default) Funktion
-
- character_escapes 0, 1 (0) Auswertung von Escape-Sequenzen
- bei der Ein- und Ausgabe.
- fileerrors 0, 1 (1) Ausgabe von Fehlermeldungen bei
- nichtexistierenden Dateien etc.
- gc_trace 0, 1, 2 (0) Ausgabe von Informationen über
- Speicherbereinigung (0=keine,
- 1=Kurzmeldung, 2=vollständig)
- unknown 0, 1 (1) Behandlung undefinierter
- Prädikate (0=Fehlschlag,
- 1=Fehler erzeugen)
- error_handling 0, 1, 2 (2) Art der Fehlerbehandlung
- (0=nur Fehlschlag, 1=Aufruf
- einer Fehlerbehandlung,
- 2=zusätzliche Fehlermeldungen)
-
- Mit prolog_flag(+Flag, -OldValue, +NewValue) kann man den Wert eines
- Flags verändern. prolog_flag(?Flag, ?Value) dient zur Abfrage ohne
- Veränderung.
-
- statistics/2 erhält als ersten Parameter eines der folgenden
- Schlüsselworte:
-
- 'runtime' Abfrage der Laufzeit
-
- 'memory' Abfrage der verschiedenen Speicherbereiche
- 'core' (mehrfach belegt, z.B. heap = program)
- 'program'
- 'heap'
- 'global_stack'
- 'local_stack'
- 'trail'
-
- 'garbage_collection' Statistiken über Speicherbereinigung
-
- Der zweite Parameter wird mit einer Liste von Zahlen unifiziert, die
- das Ergebnis der Abfrage darstellen.
-
- Es ist mir klar, daß die oben gemachten Beschreibungen bei weitem nicht
- ausreichen. Leider habe ich noch keine vernünftige Dokumentation, die ich
- mitliefern könnte; ein mit LaTeX geschriebenes Handbuch ist aber zumindest
- in Arbeit.
-
- ------- Sonstiges -------------------------------------------------------------
-
- Adressen:
-
- Teutche Puntespest: Jens Kilian
- Holunderstraße 19
- D-71083 Herrenberg
-
- Internet: jensk@hpbbn.bbn.hp.com
- MausNet: Jens Kilian @ BB
-
-
- Ich sehe mich außerdem zu folgenden Äußerungen gezwungen, weil es zu viele
- unvernünftige Menschen gibt:
-
- Ausschluss der Gewährleistung
-
- - Weil das Programm kostenlos genutzt werden darf, wird für das
- Programm keinerlei Gewährleistung eingeräumt, soweit dies gesetzlich
- zulässig ist. Falls nicht anderweitig schriftlich angegeben, stellen
- die Urheber und/oder Dritte das Programm `so wie es ist' zur
- Verfügung, ohne Gewährleistung jedweder Art, eingeschlossen die Gewähr
- zur Erreichung eines bestimmten Verwendungszwecks, aber nicht
- beschränkt auf diese. Die Benutzung erfolgt auf eigene Gefahr; das
- gesamte Risiko in Bezug auf Qualität und Leistung des Programms liegt
- bei Ihnen. Sollte sich das Programm als fehlerhaft erweisen, so tragen
- Sie alle Kosten für anfallende Wartungs-, Reparatur-oder
- Korrekturarbeiten.
-
- - Soweit gesetzlich zulässig, haften die Urheber oder Dritte, die das
- Programm wie oben gestattet verändern und/oder weiterverbreiten, für
- keinerlei Schäden (einschliesslich irgenwelcher unmittelbaren Schäden,
- mittelbaren Schäden, Folgeschäden und Drittschäden), die aus der
- Benutzung oder der Unmöglichkeit der Benutzung des Programms entstehen
- (einschliesslich des Verlusts oder der Verfälschung von Daten,
- irgendwelcher materiellen Verluste, die Ihnen oder Dritten entstehen,
- oder des Versagens des Programms, mit irgendeinem anderen Programm
- zusammenzuarbeiten, aber nicht beschränkt auf diese), sogar in dem
- Fall, daß besagten Urhebern oder Dritten die Möglichkeit der
- Entstehung solcher Schäden bekannt war oder bekannt gemacht wurde.
-
-
- Meine Arbeitgeber haben noch nie was von Prolog-68 gehört, also sparen Sie sich
- die Mühe.
-
- -------------------------------------------------------------------------------
-
- Viel Spaß,
-
- Jens Kilian
-